use serde::{Serialize, Deserialize};

/// 行为经济学因素
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BehavioralFactors {
    // 认知偏差
    pub loss_aversion: f64,          // 损失厌恶系数 (通常>1)
    pub overconfidence: f64,         // 过度自信程度 (0-1)
    pub confirmation_bias: f64,      // 确认偏误强度 (0-1)
    pub framing_effect: f64,         // 框架效应敏感度 (0-1)
    pub endowment_effect: f64,       // 禀赋效应强度 (0-1)
    
    // 情感因素
    pub mood_effect: f64,            // 情绪影响系数 (-1到1)
    pub risk_tolerance: f64,         // 风险容忍度 (0-1)
    pub stress_level: f64,           // 压力水平 (0-1)
    
    // 社会影响
    pub herd_behavior: f64,          // 从众行为倾向 (0-1)
    pub social_norm_effect: f64,     // 社会规范影响 (0-1)
    pub authority_bias: f64,         // 权威偏误 (0-1)
    pub reciprocity: f64,            // 互惠倾向 (0-1)
    
    // 经济决策启发式
    pub anchoring_effect: f64,       // 锚定效应强度 (0-1)
    pub availability_bias: f64,      // 可得性偏差 (0-1)
    pub representativeness: f64,     // 代表性启发式 (0-1)
    
    // 宏观经济影响
    pub inflation_expectation: f64,  // 通胀预期偏差 (-0.1到0.1)
    pub productivity_bias: f64,      // 生产力认知偏差 (0.8-1.2)
    pub unemployment_perception: f64, // 失业率感知偏差 (0.8-1.2)
}

impl Default for BehavioralFactors {
    fn default() -> Self {
        BehavioralFactors {
            loss_aversion: 1.5,
            overconfidence: 0.3,
            confirmation_bias: 0.4,
            mood_effect: 0.0,
            risk_tolerance: 0.5,
            herd_behavior: 0.6,
            social_norm_effect: 0.4,
            anchoring_effect: 0.5,
            availability_bias: 0.3,
            inflation_expectation: 0.02,
            productivity_bias: 1.0,
        }
    }
}

impl BehavioralFactors {
    /// 计算消费决策影响因子
    pub fn consumption_effect(&self, base_consumption: f64) -> f64 {
        let mut effect = base_consumption;
        
        // 认知偏差影响
        effect *= 1.0 - (self.loss_aversion - 1.0) * 0.15;  // 损失厌恶
        effect *= 1.0 - self.confirmation_bias * 0.1;        // 确认偏误
        effect *= 1.0 + self.framing_effect * 0.2;           // 框架效应
        effect *= 1.0 + self.endowment_effect * 0.15;        // 禀赋效应
        
        // 情感因素影响
        effect *= 1.0 + self.mood_effect * 1.5;              // 情绪影响
        effect *= 1.0 - self.stress_level * 0.3;             // 压力影响
        
        // 社会影响
        effect *= 1.0 + self.herd_behavior * 0.25;           // 从众行为
        effect *= 1.0 + self.social_norm_effect * 0.15;      // 社会规范
        effect *= 1.0 + self.authority_bias * 0.1;           // 权威偏误
        effect *= 1.0 + self.reciprocity * 0.05;             // 互惠倾向
        
        // 宏观经济认知影响
        effect *= 1.0 - self.inflation_expectation * 2.0;    // 通胀预期
        effect *= self.productivity_bias;                    // 生产力认知
        effect *= self.unemployment_perception;              // 失业率感知
        
        effect.max(0.0)
    }

    /// 计算投资决策影响因子
    pub fn investment_effect(&self, base_investment: f64) -> f64 {
        let mut effect = base_investment;
        
        // 认知偏差影响
        effect *= 1.0 + self.overconfidence * 0.4;          // 过度自信
        effect *= 1.0 + self.anchoring_effect * 0.3;        // 锚定效应
        effect *= 1.0 - self.availability_bias * 0.2;       // 可得性偏差
        effect *= 1.0 + self.representativeness * 0.15;     // 代表性启发式
        
        // 风险相关因素
        effect *= self.risk_tolerance * 2.0;                 // 风险容忍度
        effect *= 1.0 - (self.loss_aversion - 1.0) * 0.2;    // 损失厌恶
        
        // 宏观经济认知影响
        effect *= 1.0 + self.inflation_expectation * 1.5;    // 通胀预期(投资与消费相反)
        effect *= self.productivity_bias * 1.2;              // 生产力认知
        effect *= 1.0 + (self.unemployment_perception - 1.0) * 0.5; // 失业率感知
        
        effect.max(0.0)
    }

    /// 更新行为因素基于经济环境
    pub fn update_from_economy(&mut self, indicators: &super::macro_economics::MacroEconomicIndicators) {
        // 经济衰退增加损失厌恶
        if indicators.gdp_growth < 0.0 {
            self.loss_aversion = (self.loss_aversion + 0.2).min(3.0);
        }
        
        // 高通胀增加通胀预期
        self.inflation_expectation = indicators.inflation * 0.8;
        
        // 低失业率增加过度自信
        self.overconfidence = (0.5 - indicators.unemployment * 2.0).max(0.1).min(0.8);
        
        // 消费者信心影响情绪
        self.mood_effect = (indicators.consumer_confidence - 100.0) / 200.0;
    }
}